// internal/domain/interfaces.go
package domain

import (
	"context"
	"time"

	"libvirt.org/go/libvirt"
)

// VMService 虚拟机服务接口
type VMService interface {
	// 虚拟机生命周期管理
	ListVMs(ctx context.Context, connID string) ([]*VMInfo, error)
	GetVM(ctx context.Context, connID, vmName string) (*VMInfo, error)
	CreateVM(ctx context.Context, connID string, config *VMCreateConfig) (*VMInfo, error)
	CloneVM(ctx context.Context, connID, srcVM, destVM string) error
	DeleteVM(ctx context.Context, connID, vmName string, removeStorage bool) error

	// 虚拟机操作
	StartVM(ctx context.Context, connID, vmName string) error
	ShutdownVM(ctx context.Context, connID, vmName string, force bool) error
	RebootVM(ctx context.Context, connID, vmName string) error
	SuspendVM(ctx context.Context, connID, vmName string) error
	ResumeVM(ctx context.Context, connID, vmName string) error

	// 配置管理
	UpdateVMConfig(ctx context.Context, connID, vmName string, config *VMConfig) error
	GetVMXML(ctx context.Context, connID, vmName string) (string, error)
	ImportVMXML(ctx context.Context, connID string, xmlData string) (*VMInfo, error)

	// 实时监控
	GetVMMetrics(ctx context.Context, connID, vmName string) (*VMMetrics, error)
	StreamVMMetrics(ctx context.Context, connID, vmName string, interval time.Duration) (<-chan *VMMetrics, error)
}

// ConnectionManager 连接管理接口
type ConnectionManager interface {
	// 连接管理
	Connect(ctx context.Context, uri string, opts *ConnectionOptions) (string, error)
	Disconnect(ctx context.Context, connID string) error
	GetConnection(connID string) (*libvirt.Connect, error)
	ListConnections(ctx context.Context) ([]*ConnectionInfo, error)

	// 健康检查
	Ping(ctx context.Context, connID string) error
	GetCapabilities(ctx context.Context, connID string) (*Capabilities, error)
}

// // ConsoleProxy 控制台代理接口
// type ConsoleProxy interface {
// 	// 串行控制台
// 	StartSerialConsole(ctx context.Context, connID, vmName string) (io.ReadWriteCloser, error)

// 	// // 图形控制台
// 	// StartVNCProxy(ctx context.Context, connID, vmName string) (ProxyInfo, error)
// 	// StartSPICEProxy(ctx context.Context, connID, vmName string) (ProxyInfo, error)

// 	// WebSocket 代理
// 	HandleWebSocket(w http.ResponseWriter, r *http.Request, connID, vmName string) error
// }

// XMLBuilder XML 构建器接口
type XMLBuilder interface {
	BuildVMXML(config *VMCreateConfig) (string, error)
	BuildDiskXML(disk *DiskConfig) (string, error)
	// BuildNetworkXML(net *NetworkConfig) (string, error)
	ParseVMXML(xmlData string) (*VMCreateConfig, error)
	CloneVMXML(srcXML, newName string) (string, error)
}

// 领域模型

// VMInfo 虚拟机信息
type VMInfo struct {
	ID           string            `json:"id"`
	Name         string            `json:"name"`
	UUID         string            `json:"uuid"`
	State        VMState           `json:"state"`
	CPUs         uint              `json:"cpus"`
	Memory       uint64            `json:"memory"`     // KB
	MaxMemory    uint64            `json:"max_memory"` // KB
	Autostart    bool              `json:"autostart"`
	Persistent   bool              `json:"persistent"`
	OSType       string            `json:"os_type"`
	Architecture string            `json:"architecture"`
	Disks        []*DiskInfo       `json:"disks"`
	Networks     []*NetworkInfo    `json:"networks"`
	Graphics     []*GraphicsInfo   `json:"graphics"`
	CreatedAt    time.Time         `json:"created_at"`
	Metadata     map[string]string `json:"metadata"`
}

// VMState 虚拟机状态
type VMState string

const (
	VMStateRunning  VMState = "running"
	VMStateShutoff  VMState = "shutoff"
	VMStatePaused   VMState = "paused"
	VMStateCrashed  VMState = "crashed"
	VMStateShutdown VMState = "shutdown"
)

// VMCreateConfig 虚拟机创建配置
type VMCreateConfig struct {
	Name         string `json:"name" binding:"required"`
	Memory       uint64 `json:"memory" binding:"required"` // MB
	CPUs         uint   `json:"cpus" binding:"required"`
	Architecture string `json:"architecture"`
	OSType       string `json:"os_type"`
	OSVariant    string `json:"os_variant"`

	// 安装方式（三选一）
	InstallISO string `json:"install_iso"`
	InstallPXE bool   `json:"install_pxe"`
	ImportDisk string `json:"import_disk"`

	// 存储配置
	Disks []*DiskConfig `json:"disks"`

	// 网络配置
	Networks []*NetworkInterfaceConfig `json:"networks"`

	// 图形配置
	Graphics *GraphicsConfig `json:"graphics"`

	// 其他配置
	Autostart bool              `json:"autostart"`
	Metadata  map[string]string `json:"metadata"`
}

// DiskConfig 磁盘配置
type DiskConfig struct {
	Type     string `json:"type"`   // file, block
	Device   string `json:"device"` // disk, cdrom
	Source   string `json:"source"` // 路径或设备
	Size     uint64 `json:"size"`   // GB（新建时）
	Format   string `json:"format"` // qcow2, raw
	Bus      string `json:"bus"`    // virtio, sata, scsi
	Target   string `json:"target"` // vda, sda
	Cache    string `json:"cache"`  // none, writeback, writethrough
	Bootable bool   `json:"bootable"`
}

// // NetworkConfig 网络配置
// type NetworkConfig struct {
// 	Type   string `json:"type"`   // network, bridge
// 	Source string `json:"source"` // 网络名称或桥接名
// 	Model  string `json:"model"`  // virtio, e1000
// 	MAC    string `json:"mac"`    // MAC 地址（可选）
// }

// GraphicsConfig 图形配置
type GraphicsConfig struct {
	Type     string `json:"type"`   // vnc, spice
	Listen   string `json:"listen"` // 0.0.0.0
	Port     int    `json:"port"`   // -1 为自动分配
	Password string `json:"password"`
}

// VMConfig 虚拟机配置（用于更新）
type VMConfig struct {
	CPUs      *uint                     `json:"cpus,omitempty"`
	Memory    *uint64                   `json:"memory,omitempty"`
	MaxMemory *uint64                   `json:"max_memory,omitempty"`
	Autostart *bool                     `json:"autostart,omitempty"`
	BootOrder []string                  `json:"boot_order,omitempty"`
	Networks  []*NetworkInterfaceConfig `json:"networks,omitempty"`
	Metadata  map[string]string         `json:"metadata,omitempty"`
}

// VMMetrics 虚拟机性能指标
type VMMetrics struct {
	Timestamp      time.Time `json:"timestamp"`
	CPUTime        uint64    `json:"cpu_time"` // nanoseconds
	CPUPercent     float64   `json:"cpu_percent"`
	MemoryUsed     uint64    `json:"memory_used"` // KB
	MemoryPercent  float64   `json:"memory_percent"`
	DiskReadBytes  uint64    `json:"disk_read_bytes"`
	DiskWriteBytes uint64    `json:"disk_write_bytes"`
	NetRxBytes     uint64    `json:"net_rx_bytes"`
	NetTxBytes     uint64    `json:"net_tx_bytes"`
}

// ConnectionInfo 连接信息
type ConnectionInfo struct {
	ID          string    `json:"id"`
	URI         string    `json:"uri"`
	Type        string    `json:"type"` // qemu, xen, lxc
	Hostname    string    `json:"hostname"`
	Connected   bool      `json:"connected"`
	Version     uint32    `json:"version"`
	LibVersion  uint32    `json:"lib_version"`
	ConnectedAt time.Time `json:"connected_at"`
}

// ConnectionOptions 连接选项
type ConnectionOptions struct {
	ReadOnly bool        `json:"read_only"`
	Auth     *AuthConfig `json:"auth,omitempty"`
	TLS      *TLSConfig  `json:"tls,omitempty"`
}

// AuthConfig 认证配置
type AuthConfig struct {
	Username string `json:"username"`
	Password string `json:"password"`
}

// TLSConfig TLS 配置
type TLSConfig struct {
	CACert     string `json:"ca_cert"`
	ClientCert string `json:"client_cert"`
	ClientKey  string `json:"client_key"`
}

// Capabilities 能力信息
type Capabilities struct {
	Host   HostCapabilities    `json:"host"`
	Guests []GuestCapabilities `json:"guests"`
}

type HostCapabilities struct {
	UUID              string   `json:"uuid"`
	CPU               CPUInfo  `json:"cpu"`
	PowerMgmt         []string `json:"power_mgmt"`
	MigrationFeatures []string `json:"migration_features"`
}

type CPUInfo struct {
	Arch     string   `json:"arch"`
	Model    string   `json:"model"`
	Vendor   string   `json:"vendor"`
	Features []string `json:"features"`
}

type GuestCapabilities struct {
	OSType   string   `json:"os_type"`
	Arch     string   `json:"arch"`
	Machines []string `json:"machines"`
}

// ProxyInfo 代理信息
type ProxyInfo struct {
	ProxyURL  string    `json:"proxy_url"`
	WSPath    string    `json:"ws_path"`
	Token     string    `json:"token"`
	ExpiresAt time.Time `json:"expires_at"`
}

// DiskInfo 磁盘信息
type DiskInfo struct {
	Device   string `json:"device"`
	Source   string `json:"source"`
	Type     string `json:"type"`
	Format   string `json:"format"`
	Size     uint64 `json:"size"`
	Used     uint64 `json:"used"`
	Target   string `json:"target"`
	Bus      string `json:"bus"`
	Bootable bool   `json:"bootable"`
}

// // NetworkInfo 网络信息
// type NetworkInfo struct {
// 	Type    string `json:"type"`
// 	Source  string `json:"source"`
// 	MAC     string `json:"mac"`
// 	Model   string `json:"model"`
// 	State   string `json:"state"`
// 	RxBytes uint64 `json:"rx_bytes"`
// 	TxBytes uint64 `json:"tx_bytes"`
// }

// GraphicsInfo 图形信息
type GraphicsInfo struct {
	Type     string `json:"type"`
	Listen   string `json:"listen"`
	Port     int    `json:"port"`
	AutoPort bool   `json:"auto_port"`
}
